package facade;

import java.util.Hashtable;
import java.util.Vector;

import javax.ejb.Stateless;
import javax.naming.InitialContext;

import utils.ArticuloADespacharXML;
import vo.ArticuloVO;
import vo.PendienteVO;
import vo.TiendaVO;
import ejb.AdministradorArticulo;
import ejb.AdministradorPendiente;
import ejb.AdministradorRegistroADespachar;
import ejb.AdministradorTienda;

@Stateless
public class AdministradorCDBean implements AdministradorCD
{
	private AdministradorArticulo administradorArticulo;
	private AdministradorTienda administradorTienda;
	private AdministradorPendiente administradorPendiente;
	private AdministradorRegistroADespachar administradorRegistroADespachar;

	// AdministradorArticulo
	@SuppressWarnings("unchecked")
	void getAdministradorArticulo()
	{
        try
        {
			String naming = "AdministradorCDApp/AdministradorArticuloBean/local";
			Hashtable props = new Hashtable();
			InitialContext ic = new InitialContext(props);
			administradorArticulo = (AdministradorArticulo)ic.lookup(naming);
			
			if(administradorArticulo!=null)
			{
				System.out.println("Se logro conectar al bean de AdministradorArticulo");
			}
        }
        catch (Exception e)
        {
        	System.out.println("Error al conectarse al bean de AdministradorArticulo");
        	e.printStackTrace();
        }
    }

	// AdministradorPendiente
	@SuppressWarnings("unchecked")
	void getAdministradorPendiente()
	{
        try
        {
			String naming = "AdministradorCDApp/AdministradorPendienteBean/local";
			Hashtable props = new Hashtable();
			InitialContext ic = new InitialContext(props);
			administradorPendiente = (AdministradorPendiente)ic.lookup(naming);
			
			if(administradorPendiente!=null)
			{
				System.out.println("Se logro conectar al bean de AdministradorPendiente");
			}
        }
        catch (Exception e)
        {
        	System.out.println("Error al conectarse al bean de AdministradorPendiente");
        	e.printStackTrace();
        }
    }

	// AdministradorTienda
	@SuppressWarnings("unchecked")
	void getAdministradorTienda()
	{
        try
        {
			String naming = "AdministradorCDApp/AdministradorTiendaBean/local";
			Hashtable props = new Hashtable();
			InitialContext ic = new InitialContext(props);
			administradorTienda = (AdministradorTienda)ic.lookup(naming);
			
			if(administradorTienda!=null)
			{
				System.out.println("Se logro conectar al bean de AdministradorTienda");
			}
        }
        catch (Exception e)
        {
        	System.out.println("Error al conectarse al bean de AdministradorTienda");
        	e.printStackTrace();
        }
    }
	
	// AdministradorRegistroADespachar
	@SuppressWarnings("unchecked")
	void getAdministradorRegistroADespachar()
	{
        try
        {
			String naming = "AdministradorCDApp/AdministradorRegistroADespacharBean/local";
			Hashtable props = new Hashtable();
			InitialContext ic = new InitialContext(props);
			administradorRegistroADespachar = (AdministradorRegistroADespachar)ic.lookup(naming);
			
			if(administradorRegistroADespachar!=null)
			{
				System.out.println("Se logro conectar al bean de AdministradorRegistroADespachar");
			}
        }
        catch (Exception e)
        {
        	System.out.println("Error al conectarse al bean de AdministradorRegistroADespachar");
        	e.printStackTrace();
        }
    }

	// Opcion nuevoArt
	public void guardarArticulo(ArticuloVO articulovo)
	{
		System.out.println("guardarArticulo en JBoss");
		
		getAdministradorArticulo();
		
		articulovo.setStock(0);
		administradorArticulo.guardarArticulo(articulovo);
	}
	
	public ArticuloVO obtenerArticulo(int codigoArticulo)
	{
		System.out.println("obtenerArticulo en JBoss");
		ArticuloVO articulovo;

		getAdministradorArticulo();

		articulovo=administradorArticulo.obtenerArticulo(codigoArticulo);
		System.out.println("Articulo a devolver desde JBoss: " + articulovo.getCodigo());
		
		return articulovo;
	}

	// Opcion SolDist
	public void enviarSolicitud(ArticuloADespacharXML articuloadespachar)
	{
		System.out.println("enviarSolicitud en JBoss");
		
		int cantidad;
		int nuevostock;
		int existente;
		
		getAdministradorPendiente();
		getAdministradorArticulo();
		getAdministradorRegistroADespachar();
		
		administradorRegistroADespachar.registrarADespachar(articuloadespachar);

		PendienteVO pendientevo=administradorPendiente.obtenerPendiente(articuloadespachar.getCodigoArticulo(), articuloadespachar.getCodigoTienda());
		System.out.println("Codigo Pendiente: " + pendientevo.getCodigoPendiente());
		System.out.println("Codigo Tienda: " + (pendientevo.getTienda()).getCodigo());
		System.out.println("Codigo Articulo: " + (pendientevo.getArticulo()).getCodigo());
		System.out.println("A Enviar a tienda: " + pendientevo.getAEnviarATienda());
		System.out.println("A Pedir de Fabrica: " + pendientevo.getAPedirAFabrica());
		System.out.println("A Llegar de Fabrica y Enviar: " + pendientevo.getALlegarDeFabricaYEnviar());
		System.out.println("A Llegar de Fabrica: " + pendientevo.getALlegarDeFabrica());
		
		if(pendientevo.getArticulo()==null)
		{
			System.out.println("enviarSolicitud en JBoss: el articulo a despachar se desconoce");
			return;
		}
		
		cantidad=articuloadespachar.getCantidad();
		
		if(cantidad<=(pendientevo.getArticulo()).getStock())
		{
			nuevostock=(pendientevo.getArticulo()).getStock()-cantidad;
			(pendientevo.getArticulo()).setStock(nuevostock);
			
			existente=pendientevo.getAEnviarATienda();
			pendientevo.setAEnviarATienda(existente+cantidad);
			administradorPendiente.guardarPendiente(pendientevo);
		}
		else
		{
			existente=pendientevo.getAEnviarATienda();
			pendientevo.setAEnviarATienda(existente+(pendientevo.getArticulo()).getStock());
			
			existente=pendientevo.getAPedirAFabrica();
			pendientevo.setAPedirAFabrica(existente+(cantidad-(pendientevo.getArticulo()).getStock()));
			
			(pendientevo.getArticulo()).setStock(0);
			administradorPendiente.guardarPendiente(pendientevo);
		}
		
		System.out.println("enviarSolicitud en JBoss completa");
	}

	// Opcion SolDist, EnvT, SolFabr, RepAF
	@SuppressWarnings("unchecked")
	public Vector obtenerAEnviarYPendientes()
	{
		System.out.println("obtenerAEnviarYPendientes en JBoss");

		getAdministradorPendiente();
		
		System.out.println("obtenerAEnviarYPendientes en JBoss completa");
		return administradorPendiente.obtenerPendientes();
	}

	// Opcion EnvT
	@SuppressWarnings("unchecked")
	public Vector obtenerPendientesConTienda(TiendaVO tienda)
	{
		System.out.println("obtenerPendientesConTienda en JBoss");
		getAdministradorPendiente();
		
		return administradorPendiente.obtenerPendientesConTienda(tienda);
	}

	@SuppressWarnings("unchecked")
	public Vector obtenerTiendas()
	{
		System.out.println("obtenerTiendas en JBoss");
		getAdministradorTienda();
		
		return administradorTienda.obtenerTiendas();
	}

	public void registrarEnvioATienda()
	{
		System.out.println("registrarEnvioATienda en JBoss");
		getAdministradorPendiente();
		
		administradorPendiente.registrarEnvioATienda();
	}

	// Opcion SolFabr
	public void registrarAPedirAFabrica()
	{
		System.out.println("registrarAPedirAFabrica en JBoss");
		getAdministradorPendiente();
		
		administradorPendiente.registrarAPedirAFabrica();
	}

	@SuppressWarnings("unchecked")
	public Vector obtenerArticulos()
	{
		System.out.println("obtenerArticulos en JBoss");
		getAdministradorArticulo();
		
		return administradorArticulo.obtenerArticulos();
	}

	@SuppressWarnings("unchecked")
	public Vector obtenerPendientesConArticulo(ArticuloVO articulo)
	{
		System.out.println("obtenerPendientesConArticulo en JBoss");
		getAdministradorPendiente();
		
		return administradorPendiente.obtenerPendientesConArticulo(articulo);
	}

	// Opcion RepAF
	public void enviarReposicion(ArticuloVO articulo)
	{
		System.out.println("enviarReposicion en JBoss");
		getAdministradorPendiente();
		getAdministradorArticulo();
		
		int astock=administradorPendiente.enviarReposicionYPoneAEnviar(articulo);
		administradorArticulo.agregarStock(articulo.getCodigo(), astock);
		administradorPendiente.enviarReposicion(articulo, astock);
	}
}
